<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            一个人  继承 另一个人的 东西--财产--技能 （属性(有的东西)-方法（会的技能））


            封装-》 构造函数--类 ------》面向过程--函数



            一个类（子类） 继承 另一个类（父类）--》  子类就用拥有 父类的 里面的 属性和方法
            继承好处：复用另一个类的代码


            js中继承有哪些---构造函数继承-原型链继承-混合继承-es6 类--继承
            es5实现继承有哪些方式---构造函数继承-原型链继承-混合继承

            1-构造函数继承
                核心--子类调用 父类的构造函数，并且改变其中的this
                缺点：只能继承构造函数内部的属性，不能继承原型的方法

            2-原型链继承
                强制改变 构造函数（类）的原型，让他指向一个对象，优点：能继承原型上方法
                    缺点：继承属性没有太大意义

            3-混合继承（寄生继承）
                 核心--子类调用 父类的构造函数，并且改变其中的this--继承父类的属性
                强制改变 构造函数（类）的原型，让他指向一个对象，优点：能继承原型上方法



            4-es6 类--继承  
                class 子类 extends 父类 
        */

        // 动物类--父类
        function Animal(name) {
            // this = {}
            this.name = name;
            this.age = 0

        }
        Animal.prototype.run = function () {
            console.log(this.name + ':跑');
        }

        // 狗类--子类
        function Dog(name) {
            // Animal.call(this, name)
            // Animal.apply(this, [name])
            let fn = Animal.bind(this);
            fn(name);
        }

        // 原型继承--原型链继承--
        // 能继承 原型上的属性 和 方法
        // 缺点：属性 ---继承的属性没有太大意义
        // 把Dog的原型 强制 改变了， 改变成了 一个动物对象
        // ****
        Dog.prototype = new Animal('aa');



        let d1 = new Dog('小黑')
        console.log(d1);

        // 属性是通过 调用父类的构造函数 给 对象添加的属性
        console.log(d1.age);
        console.log(d1.name);

        // 修改了DOg的原型指向 拥有Animal里面的方法
        d1.run()





    </script>

</body>

</html>